package base;

/**
 * @author He Changjie on 2021/7/17
 */
public class Base8 {

    /**
     * 实现 pow(x, n) ，即计算 x 的 n 次幂函数（即，xn）。不得使用库函数，同时不需要考虑大数问题。
     *
     * 示例 1：
     * 输入：x = 2.00000, n = 10
     * 输出：1024.00000
     *
     * 示例 2：
     * 输入：x = 2.10000, n = 3
     * 输出：9.26100
     *
     * 示例 3：
     * 输入：x = 2.00000, n = -2
     * 输出：0.25000
     * 解释：2-2 = 1/22 = 1/4 = 0.25
     *  
     *
     * 提示：
     * -100.0 < x < 100.0
     * -2^31 <= n <= 2^31-1
     * -104 <= xn <= 104
     */
    public static void main(String[] args) {
//        System.out.println(myPow(2.00000, -2));
//        System.out.println(myPow(2.00000, -2147483648));
        System.out.println(myPow2(2.00000, -2147483648));
//        System.out.println(myPow(2.00000, 10));
//        System.out.println(myPow(2.10000, 3));
//        System.out.println(myPow(2.00000, -2));
    }

    public static double myPow(double x, int n) {
        if(n == 0){return 1;}
        if(x == 0 || x == 1){return x;}
        int i = 0;
        double r = x;
        if(n < 0){
            r=x=1/x;
            while (i-- > n + 1){
                r*=x;
            }
        }else{
            while (i++ < n - 1){
                r*=x;
            }
        }
        return r;
    }

    public static double myPow2(double x, int n) {
        if(x == 0) {return 0;}
        long b = n;
        double res = 1.0;
        if(b < 0) {
            x = 1 / x;
            b = -b;
        }
        while(b > 0) {
            if((b & 1) == 1) {res *= x;}
            x *= x;
            b >>= 1;
        }
        return res;
    }

}
